<?php

// 严格模式
declare(strict_types=1);

// 命名空间
namespace Kingbes\Gui;

use Kingbes\Raylib\Core;
use Kingbes\Raylib\Text;
use \FFI\CData;

class Font
{
    // 字体数据
    public static array $fontData;
    // 字体对象
    public static CData $font;
    // 文本
    public static string $text = "";
    // 是否加载
    public static bool $loaded = false;
    // 字体后缀
    public static string $fontSuffix = "otf";

    /**
     * 字体文件
     *
     * @param string $path
     * @return void
     */
    public static function file(string $path): void
    {
        self::$fontData = Core::loadFileData($path);
        // 获取文件后缀名赋值给 $fontSuffix
        self::$fontSuffix = pathinfo($path, PATHINFO_EXTENSION);
    }

    /**
     * 添加文本
     *
     * @param string $text 文本
     * @return void
     */
    public static function addText(string $text): void
    {
        if (self::$loaded) {
            throw new \Exception("字体已经加载完毕，不能再添加文本。");
        }
        self::$text .= $text;
    }

    /**
     * 加载字体
     *
     * @return void
     */
    public static function load(): void
    {
        if (!isset(self::$font)) {
            self::file(__DIR__
                . DIRECTORY_SEPARATOR . "font"
                . DIRECTORY_SEPARATOR . "default.otf");
        }
        // 加载字体码位
        $codepoints = Text::loadCodepoints(self::$text);
        // 从内存加载字体
        $font = Text::loadFontFromMemory(
            "." . self::$fontSuffix,
            self::$fontData["data"],
            self::$fontData["size"],
            200,
            $codepoints["data"],
            $codepoints["count"]
        );
        // 字体对象赋值
        self::$font = $font;
        // 释放码点表
        Text::unloadCodepoints($codepoints["data"]);
        if (Text::isFontValid($font) == false) {
            // 如果字体加载失败，抛出异常
            throw new \Exception("无法加载系统字体，请检查路径是否正确！");
        }
    }
}
